// SharpenComplex ( jim.ro )=ps_2_0 // http://www.homecinema-fr.com/forum/viewtopic.php?t=29814317 sampler s0 : register(s0); float4 p0 : register(c0); float4 p1 : register(c1); #define width (p0[0]) #define height (p0[1]) #define dx (p1[0]) #define dy (p1[1]) float4 main( float2 tex : TEXCOORD0 ) : COLOR { // definition des pixels : original, flouté, corigé, final float4 ori; float4 flou; float4 cori; float4 final; //////////////////////////////////////////////////// // récuppération de la matrice de 9 points // [ 1, 2 , 3 ] // [ 4,ori, 5 ] // [ 6, 7 , 8 ] ori = tex2D(s0, tex); float4 c1 = tex2D(s0, tex + float2(-dx,-dy)); float4 c2 = tex2D(s0, tex + float2(0,-dy)); float4 c3 = tex2D(s0, tex + float2(dx,-dy)); float4 c4 = tex2D(s0, tex + float2(-dx,0)); float4 c5 = tex2D(s0, tex + float2(dx,0)); float4 c6 = tex2D(s0, tex + float2(-dx,dy)); float4 c7 = tex2D(s0, tex + float2(0,dy)); float4 c8 = tex2D(s0, tex + float2(dx,dy)); //////////////////////////////////////////////////// // calcul image floue (filtre gaussien) // pour normaliser les valeurs, il faut diviser par la somme des coef // 1/(1+2+1+2+4+2+1+2+1) = 1/ 16 = .0625 flou = (c1+c3+c6+c8 + 2*(c2+c4+c5+c7)+ 4*ori)*0.0625; // soustraction de l'image flou à l'image originale cori = 2*ori - flou; //////////////////////////////////////////////////// // détection des contours float delta1; float delta2; float value; // par filtre de sobel // Gradient horizontal // [ -1, 0 ,1 ] // [ -2, 0, 2 ] // [ -1, 0 ,1 ] delta1 = (c3 + 2*c5 + c8)-(c1 + 2*c4 + c6); // Gradient vertical // [ -1,- 2,-1 ] // [ 0, 0, 0 ] // [ 1, 2, 1 ] delta2 = (c6 + 2*c7 + c8)-(c1 + 2*c2 + c3); // calcul value = sqrt( mul(delta1,delta1) + mul(delta2,delta2) ) ; if( value >.3 ) { //////////////////////////////////////////////////// // si contour, sharpen #define Sharpen_val0 2.0 #define Sharpen_val1 0.125 final = ori*2 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ) * 0.125 ; // final= float4(1,0,0,0); return final; } else { //////////////////////////////////////////////////// // sinon, image corrigée return cori; } }